package edu.seminario

import org.springframework.transaction.annotation.Transactional

import edu.seminario.exception.UserNotExistException;
import edu.seminario.utils.TipoBusqueda

abstract class BusquedasService {

	/**
	 * 
	 * @param userAdminId
	 * @param edad
	 * @param sexo
	 * @param pedido_tarjeta_credito
	 * @param pedido_cuponeras
	 * @param cantidad_resultados
	 * @return
	 */
	@Transactional
	public def buscar(Integer userAdminId, Map<String, Criterio> criterios){
		def result = ejecutarQuery(criterios)
		UsuarioAdmin usuarioAdmin = buscarUsuario(userAdminId)
		actualizarHistorial(usuarioAdmin, criterios.values())
		return result;
	}

	private UsuarioAdmin buscarUsuario(Integer userAdminId) {
		UsuarioAdmin usuarioAdmin = UsuarioAdmin.get(userAdminId)
		if (!usuarioAdmin) {
			throw new UserNotExistException(userAdminId)
		}
		return usuarioAdmin
	}

	protected abstract def ejecutarQuery(def criterios)
	protected abstract TipoBusqueda getTipoBusqueda()
	
	private void actualizarHistorial(UsuarioAdmin usuarioAdmin, Collection<Criterio> criterios) {
		Busqueda busqueda = new Busqueda()
		busqueda.setTipo(getTipoBusqueda())
		busqueda.setUsuarioAdmin(usuarioAdmin)
		busqueda.setFecha(new Date())
		busqueda.save()
		criterios.each {
			it.busqueda = busqueda
			it.save() 
		}
	}
}
